import java.util.Arrays;

public class Test {
    //例题：给定一个整数数组 nums 和一个整数目标值 target，
    // 请你在该数组中找出 和为目标值 target 的那 两个 整数，并返回它们的数组下标。
    public static void main(String[] args) {
        int[] array = {2,4,16,8,10};
        array = findSum(array, 18);
        System.out.println(Arrays.toString(array));

    }
    public static int[] findSum(int[] tmpArr,int key) {
        int[] array1 = {-1,-1};   //赋值-1，是因为数组的下标没有负数，这样的数组的内容就可以存放下标了
        //外层循环表示趟数
        for (int i = 0; i < tmpArr.length; i++) {
            boolean flg = false;
            for (int j = i + 1; j < tmpArr.length; j++) {
                if(tmpArr[i] + tmpArr[j] == key) {
                    array1[0] = i;
                    array1[1] = j;
                    flg = true;
                    break;        //两个返回值用数组来接收
                }
            }
            if(flg == true) {      //用来寻找第一个满足题目要求的下标
                break;
            }
        }
        return array1;
    }

    //冒泡排序：升序
    public static void main8(String[] args) {
        int[] array = {2,4,16,8,10};
        bubbleSort(array);
        System.out.println(Arrays.toString(array));
    }
    public static void bubbleSort(int[] tmpArr) {
        //最外层循环表示：趟数
        for (int i = 0; i < tmpArr.length; i++) {
            boolean flg = false;      //注意这个标志位不能放在外面，因为每次交换都要进行重置flg
                                      //若放到外面，有一次交换后 ，flg=ture，一直都是ture，后面if检查永远都是ture
                                          //相当于没有优化了
            //内循环 表示 一趟比较（tmpArr.length - 1 - i）次
            for (int j = 0; j < tmpArr.length - 1 - i; j++) {
                if(tmpArr[j] > tmpArr[j + 1]) {
                    //交换
                    int ret = tmpArr[j];
                    tmpArr[j] = tmpArr[j + 1];
                    tmpArr[j + 1] = ret;
                    flg = true;
                }
            }
            if(!flg) {
                return;
            }
        }
    }

    //二分查找，要求得是有顺序的
    public static void main7(String[] args) {
        int[] array = {2,4,16,8,10};
        Arrays.sort(array);
        System.out.println(binarySearch(array,8));
    }
    public static int binarySearch(int[] tmpArr,int key) {
        int left = 0;
        int right = tmpArr.length - 1;
        int mid = (left + right) / 2;
        while (left <= right) {
            if (tmpArr[mid] < key) {
                left = mid + 1;
            } else if (tmpArr[mid] > key) {
                right = mid - 1;
            } else {
                return mid;
            }
        }
        return -1;
    }
    //奇数位于偶数之前  例题调整版
    public static void main6(String[] args) {
        int[] array = {1,2,3,4,5};
        func2(array);
        System.out.println(Arrays.toString(array));
    }
    public static void func2(int[] tmpArr) {
        int left = 0;
        int right = tmpArr.length - 1;
        while(left < right) {
            while(left < right && tmpArr[left] % 2 != 0) {   //防止数组越界
                left++;
            }
            while(left < right && tmpArr[right] % 2 == 0) {
                right--;
            }
            int tmp = tmpArr[left];
            tmpArr[left] = tmpArr[right];
            tmpArr[right] = tmp;
        }
    }



    //例题1：调整数组顺序使得奇数位于偶数之前。调整之后，不关心大小顺序。
    //如数组：[1,2,3,4,5,6]
    //调整后可能是：[1, 5, 3, 4, 2, 6]
    public static void main3(String[] args) {
        int[] array = {2,4,6,8,10};
        array = func(array);
        System.out.println(Arrays.toString(array));
    }
    //注意当开始位置一直为奇数的情况
    public static int[] func(int[] tmpArr) {
        int left = 0;
        int right = tmpArr.length - 1;
        while(left <= right) {
            if(tmpArr[left] % 2 == 0) { //判断为偶数
                if(tmpArr[right] % 2 != 0) {  //判断为奇数
                    int ret = 0;
                    ret = tmpArr[left];
                    tmpArr[left] = tmpArr[right];
                    tmpArr[right] = ret;
                    left++;
                    right--;
                }else {
                    right--;
                }
            }else {
                left++;
            }
           /* left++;
            right--;*/
        }
        return tmpArr;
    }

    //例题：实现一个方法 transform, 以数组为参数, 循环将数组中的每个元素 乘以 2 ,
    // 并设置到对应的数组元素上. 例如 原数组为 {1, 2, 3}, 修改之后为 {2, 4, 6}
    public static void main1(String[] args) {
        int[] array = {1,2,3};
        array = transform(array);
        System.out.println(Arrays.toString(array));
    }
    public static int[] transform(int[] tmpArr) {
        for (int i = 0; i < tmpArr.length; i++) {
            tmpArr[i] *= 2;
        }
        return tmpArr;
    }
}
